HANDLE SetClipboardData(

UINT uFormat,

HANDLE hMem);

Parameters

格式:

[in] Unsigned integer that specifies a clipboard format. This parameter can be a registered format or any of the standard clipboard formats. Windows CE supports the following standard clipboard:

Value

Description

CF_BITMAP

A handle to a bitmap (HBITMAP).

CF_DIB

A memory object containing a BITMAPINFO structure followed by the bitmap bits.

CF_DIF

Software Arts' Data Interchange Format.

CF_PALETTE

[参见MSDN]

CF_PENDATA

Data for the pen extensions to the Microsoft? Windows? for Pen Computing.

CF_RIFF

Represents audio data more complex than can be represented in a CF_WAVE standard wave format.

CF_SYLK

Microsoft Symbolic Link (SYLK) format.

CF_TEXT

Text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. Use this format for ANSI text.

CF_WAVE

Represents audio data in one of the standard wave formats, such as 11 kHz or 22 kHz pulse code modulation (PCM).

CF_TIFF

Tagged-image file format.

CF_UNICODETEXT

Unicode text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data.

 

举例1:文本的复制与粘贴

/*
将数据COPY到剪切板原理:
1:OpenClipboard() 打开剪切板
2:EmptyClipboard() 清空剪切板,让当前进程拥有剪切板
3:GlobalAlloc() 分配全局堆内存
4:GlobalLock() 锁定内存并返回内存首地址
5:strcpy() 给内存赋值
6:GlobalUnlock() 解锁内存
7:SetClipboardData() 设置到剪切板
8:CloseClipboard() 关闭剪切板

*/
void CClipboardDlg::OnBnClickedButton2()
{
if(OpenClipboard())//打开剪切板
{
    EmptyClipboard();//清空剪切板,让当前窗口进程拥有剪切板
   CString Str;
   GetDlgItemText(IDC_EDIT_SEND,Str);//获取数据
   HANDLE hClip;
   hClip=GlobalAlloc(GMEM_MOVEABLE,Str.GetLength()+1);//分配内存对象返回地址(该函数是系统从全局堆中分配内存)
   char *pBuf;
   pBuf=(char *)GlobalLock(hClip);//锁定全局内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处
    strcpy(pBuf,Str);//将Str对象中的数据Copy到内存空间中
    GlobalUnlock(hClip);//解锁全局内存块
    SetClipboardData(CF_TEXT,hClip);//设置剪贴板数据
    CloseClipboard();//关闭
}
}
/*
从剪切板取回数据的原理:
1:IsClipboardFormatAvailable() 判断剪切板是否有要取回的数据
2:OpenClipboard() 打开剪切板
3:GetClipboardData() 取回指定格式的对象句柄
4:GlobalLock() 锁定内存,并取回对象的数据
5:GlobalUnlock 解锁
6:CloseClipboard() 关闭剪切板
*/
void CClipboardDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if(IsClipboardFormatAvailable(CF_TEXT))//获取剪贴板里的格式是否可以处理
{
   if(OpenClipboard())
   { HANDLE hClip;
    char *pBuf;
    hClip=GetClipboardData(CF_TEXT); //检索从指定格式剪贴板数据,并返回一个剪贴板对象句柄
    pBuf=(char *)GlobalLock(hClip);//锁定全局内存中指定的内存块 并返回一个地址值,并返回数据指针头地址
     GlobalUnlock(hClip);           //解锁
    SetDlgItemText(IDC_EDIT_RECV,pBuf);
     CloseClipboard();
   }
}
}

举例2.BITMAP的复制与粘贴

位图的复制

if (::OpenClipboard (m_hWnd)) {

    // Make a copy of the bitmap.

    BITMAP bm;

    CBitmap bitmap;

    CBitmap m_bitmap;

    m_bitmap.LoadBitmap(IDB_BITMAP2);

    m_bitmap.GetObject (sizeof (bm), &bm);

    bitmap.CreateBitmapIndirect (&bm);

 

    CDC dcMemSrc, dcMemDest;

    dcMemSrc.CreateCompatibleDC (NULL);

    CBitmap* pOldBitmapSrc = dcMemSrc.SelectObject (&m_bitmap);

    dcMemDest.CreateCompatibleDC (NULL);

    CBitmap* pOldBitmapDest = dcMemDest.SelectObject (&bitmap);

 

    dcMemDest.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &dcMemSrc,

        0, 0, SRCCOPY);

    HBITMAP hBitmap = (HBITMAP) bitmap.Detach ();

 

    dcMemDest.SelectObject (pOldBitmapDest);

    dcMemSrc.SelectObject (pOldBitmapSrc);

 

    // Place the copy on the clipboard.

    ::EmptyClipboard ();

    ::SetClipboardData (CF_BITMAP, hBitmap);

    ::CloseClipboard ();

}

位图的粘贴:

把存在于剪贴板中的位图数据显示到程序的客户区:

HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄

::OpenClipboard(hWnd); // 打开剪贴板

HANDLE hBitmap = ::GetClipboardData(CF_BITMAP); // 获取剪贴板数据句柄

HDC hDC = ::GetDC(hWnd); // 获取设备环境句柄

HDC hdcMem = CreateCompatibleDC(hDC); // 创建与设备相关的内存环境

SelectObject(hdcMem, hBitmap); // 选择对象

SetMapMode(hdcMem, GetMapMode(hDC)); // 设置映射模式

BITMAP bm; // 得到位图对象

GetObject(hBitmap, sizeof(BITMAP), &bm);

BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); //位图

复制

::ReleaseDC(hWnd, hDC); // 释放设备环境句柄

DeleteDC(hdcMem); // 删除内存环境

::CloseClipboard(); // 关闭剪贴板

3. 多数据项

要把数据放入剪贴板,在打开剪贴板后一定要调用EmptyClipboard()函数清除当前

剪贴板中的内容,而不可以在原有数据项基础上追加新的数据项。但是,可以在

EmptyClipboard()和CloseClipboard()调用之间多次调用SetClipboardData()

函数来放置多个不同格式的数据项。例如

OpenClipboard(hWnd);

EmptyClipboardData();

SetClipboardData(CF_TEXT, hGMemText);

SetClipboardData(CF_BITMAP, hBitmap);

CloseClipboard();

这时如果用CF_TEXT或CF_BITMAP等格式标记去调用IsClipboardFormatAvailable()

都将返回TRUE,表明这几种格式的数据同时存在于剪贴板中。以不同的格式标记去调

用GetClipboardData()函数可以得到相应的数据句柄。

对于多数据项的剪贴板数据,还可以用CountClipboardFormats()和

EnumClipboardFormats()函数得到当前剪贴板中存在的数据格式数目和具体的数据

格式。EnumClipboardFormats()的函数原型为:

UINT EnumClipboardFormats(UINT format);

参数format指定了剪贴板的数据格式。如果成功执行将返回format指定的格式的下一

个数据格式值,如果format为最后的数据格式值,那么将返回0。由此不难写出处理

剪贴板中所有格式数据项的程序段代码:

UINT format = 0; // 从第一种格式值开始枚举

OpenClipboard(hWnd);

while(format = EnumClipboardFormats(format))

{

…… // 对相关格式数据的处理

}

CloseClipboard();

4.延迟提交

http://apps.hi.baidu.com/share/detail/30391289